package com.he.DesignPatterns.proxy.JdkProxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * @description: 作为访问对象与目标对象之间的中介
 * @Author: HCL
 * @Date: 2024/8/26 15:03
 */
public class ProxyFactory{

//    声明火车站对象
    private TrainStation trainStation = new TrainStation();

    public SellTickets getProxyObject(){
        //ClassLoader loader,   类加载器：用于加载代理类，可以通过目标对象获取类加载器
        //Class<?>[] interfaces 代理类实现的接口的字节码对象
        //InvocationHandler h)  代理对象的调用处理程序
        SellTickets sellTickets = (SellTickets) Proxy.newProxyInstance(
                trainStation.getClass().getClassLoader(),
                trainStation.getClass().getInterfaces(),
//                TrainStation.class.getClassLoader(),
//                TrainStation.class.getInterfaces(),
                new InvocationHandler() {
                    @Override
                    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                        System.out.println("代收点收取代理费_JDK动态代理");
                        Object obj = method.invoke(trainStation, args);//这里是相当于调用了sell()方法
                        return obj;
                    }
                }
        );
        return sellTickets;
    }
}
